iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
Software Development

C# 學習之路系列 第 28

[DAY27] C#基礎與實作(WinForms開發-實作練習-檔案複製分類)

  • 分享至 

  • xImage
  •  

C# 程式基礎

WinForms開發-實作練習-檔案複製分類:

  撰寫程式,是為了讓生活可以更方便簡易,假如目前有一個需求要將檔案做分類

檔案複製分類:

  • 設計功能:
    • 選擇來源資料夾和目標資料夾,複製來源資料夾 對應的副檔名檔案到目標資料夾內
    • 設計草稿:
      • 草稿1:
        https://ithelp.ithome.com.tw/upload/images/20231010/20163217vHH56OWPvZ.png
      • 草稿2:
        https://ithelp.ithome.com.tw/upload/images/20231010/20163217thsEVfeYEY.png
      • 草稿3:
        https://ithelp.ithome.com.tw/upload/images/20231010/20163217pqfAKQbrKi.png
    • 設計思維:
      • 草稿1:
        想對該來源資料夾的副檔名做分類
      • 草稿2:
        想對該來源資料夾的副檔名做分類,期望一次多選分類被分到對應的副檔名資料夾
      • 草稿3:
        1. 想要知道對應的錯誤訊息和結果,加入console結果
          (加入 Textbox: consoleTextBox)
        2. 想要可以刪除來源端資料以節省空間(可選)
  • 程式實作 與 方案功能進階:
    1. 建立 WinForms 專案:
      首先,需要在Visual Studio中建立一個新的WinForms應用程式專案。將所需要的UI介面工具先建立出來。
      Button :btnSelectSrcPath. btnSelectDstPath. btnRun
      Textbox :TxtSelectSourcePath.TxtSelectDestinationPath
      Checkbox:chkRemove
      Listbox :listBoxFileExtension

    2. 運用FolderBrowserDialog:
      使用 FolderBrowserDialog,跳出選擇路徑的選項,將來源與目標資料夾路徑加入。

      string GetFolderPath()
      {
          using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog())
          {
              DialogResult result = folderBrowserDialog.ShowDialog();
              if (result == DialogResult.OK && 
      
                  !string.IsNullOrWhiteSpace(folderBrowserDialog.SelectedPath))
              {
                  return folderBrowserDialog.SelectedPath;
              }
              return null;
          }
      }
      
    3. 按鈕功能實作:

      private void btnSelectSrcPath_Click(object sender, EventArgs e)
      {
          TxtSelectSourcePath.Text = GetFolderPath();
      }
      
      private void btnSelectDstPath_Click(object sender, EventArgs e)
      {
          TxtSelectDestinationPath.Text = GetFolderPath();
      }
      
      private void btnRun_Click(object sender, EventArgs e)
      {
          consoleTextBox.Text = string.Empty;
          if (string.IsNullOrEmpty(TxtSelectSourcePath.Text))
          {
              consoleTextBox.AppendText("未選擇來源路徑。" + Environment.NewLine);
              return;
          }
          if (string.IsNullOrEmpty(TxtSelectDestinationPath.Text))
          {
              consoleTextBox.AppendText("未選擇目標路徑。" + Environment.NewLine);
              return;
          }
      
          // 判斷選擇的選項是否為空
          if (listBoxFileExtension.SelectedItems.Count == 0)
          {
              consoleTextBox.AppendText("未選擇副檔名。" + Environment.NewLine);
              return;
          }
      
          // 選擇來源路徑:
          string sourcePath = TxtSelectSourcePath.Text;
      
          // 選擇目標路徑:
          string destPath = TxtSelectDestinationPath.Text;
      
          List<string> listFileExtension = new List<string>();
          foreach (var item in listBoxFileExtension.SelectedItems)
          {
              listFileExtension.Add(item.ToString());
          }
      
          // 是否要刪除原檔案路徑的資料:
          bool IsDeleteSource = chkRemove.Checked;
      
          if (!Directory.Exists(sourcePath))
          {
              consoleTextBox.AppendText("來源路徑不存在!" + Environment.NewLine);
              return;
          }
      
          if (!Directory.Exists(destPath))
          {
              Directory.CreateDirectory(destPath);
          }
          foreach (string fileExtension in listFileExtension)
          {
              string targetDir = Path.Combine(destPath, fileExtension.TrimStart('.'));
              Directory.CreateDirectory(targetDir);
      
              string[] filesToCopy = Directory.GetFiles(sourcePath, $"*{fileExtension}");
              int copiedCount = 0;
      
              foreach (string filePath in filesToCopy)
              {
                  string fileName = Path.GetFileName(filePath);
                  string destFilePath = Path.Combine(targetDir, fileName);
      
                  try
                  {
                      File.Copy(filePath, destFilePath, true);
      
                      if (File.Exists(destFilePath))
                      {
                          FileInfo sourceFileInfo = new FileInfo(filePath);
                          FileInfo destFileInfo = new FileInfo(destFilePath);
      
                          if (sourceFileInfo.Length == destFileInfo.Length)
                          {
                              copiedCount++;
                          }
                      }
      
                      if (IsDeleteSource)
                      {
                          File.Delete(filePath);
                      }
                  }
                  catch (Exception ex)
                  {
                      consoleTextBox.AppendText($"複製檔案 {fileName} 時出錯:{ex.Message}" + Environment.NewLine);
                  }
              }
              consoleTextBox.AppendText($"已成功複製 {copiedCount} 個 {fileExtension} 檔案至 {targetDir}" + Environment.NewLine);
          }
      
      }
      
      
  • 程式執行結果:
      https://ithelp.ithome.com.tw/upload/images/20231010/20163217wjiRyNH0De.png

參考來源

  1. ChatGPT
  2. C#最強入門邁向頂尖高手之路王者歸來
  3. w3schools C#
  4. 圖解資料結構 × 演算法:運用C#

期望挑戰30天持續更新成功 ~ DAY27


上一篇
[DAY26] C#基礎與實作(WinForms開發-畫資料圖表)
下一篇
[DAY28] C#基礎與實作(WinForms開發-常用功能與實作練習)
系列文
C# 學習之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言